package org.niux.aims.service.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;

import org.niux.aims.dao.IMenuDAO;
import org.niux.aims.models.Menu;
import org.niux.aims.service.IMenuService;
import org.niux.aims.vo.MenuVO;
import org.springframework.stereotype.Service;

/**
 * 
 * Copyright (c) 2009,niux<br>
 * All rights reserved.<br>
 * 
 * 文件名称：MenuService.java<br>
 * 摘    要：菜单数据操作服务类<br>
 * <br>
 * 当前版本：<br>
 * 作    者：铭显 Email: <a href="mailto:liangmingxian@gmail.com">liangmingxian@gmail.com</a><br>
 * 完成日期：@since 2013-7-30<br>
 * <br>
 * 取代版本：<br>
 * 原作者  ：<br>
 * 完成日期：@since Oct 22, 2009<br>
 */
@Service(value="menuService")
public class MenuService implements IMenuService {

	@Resource(name="menuDao")
	private IMenuDAO menuDao;
	
	/**
	 * 
	 * 方法概述：获取菜单
	 * 描述：获取菜单
	 * @param entityCodes
	 * @return
	 * 返回类型：List<Menu>
	 * 修改人：梁铭显
	 * 修改时间：2013-7-30
	 */
	public List<MenuVO> getMenusByEntityCodes(List<String> entityCodes){
		List<MenuVO> menuVos = new ArrayList<MenuVO>();
		
		if(entityCodes.isEmpty()){ //获取全部菜单
			List<Menu> menus = menuDao.findAllMenus();
			menuVos = transformToVos(menus);
		} else {
			StringBuffer menuCodes = new StringBuffer();
			
			for (String code : entityCodes) {
				menuCodes.append("'"+code+"',");
			}
			
			menuCodes = menuCodes.deleteCharAt(menuCodes.length() - 1);
			
			List<Menu> menus = menuDao.findMenusByCode(menuCodes.toString());

			menuVos = transformToVos(menus);
			
			Iterator<MenuVO> mi = menuVos.iterator();
			
			//删除菜单中编码不存在于entityCodes的元素
			while(mi.hasNext()){
				MenuVO menu = mi.next();
				
				Iterator<MenuVO> ci = menu.getMenus().iterator();
				while(ci.hasNext()){
					MenuVO child = ci.next();
					if(!entityCodes.contains(child.getMenuCode())){
						ci.remove();
					}
				}
			}
		}
		
		return menuVos;
	}
	
	/**
	 * 
	 * 方法概述：批量转换Menu实体
	 * 描述：批量转换Menu实体
	 * @param menus
	 * @return
	 * 返回类型：List<MenuVO>
	 * 修改人：梁铭显 
	 * 修改时间：2013-9-27
	 */
	public List<MenuVO> transformToVos(List<Menu> menus){
		List<MenuVO> menuVos = new ArrayList<MenuVO>();
		
		for (Menu menu : menus) {
			MenuVO menuVo = transformToVo(menu);
			
			if(!menu.getMenus().isEmpty()){
				List<MenuVO> childs = new ArrayList<MenuVO>();
				
				for (Menu child : menu.getMenus()) {
					MenuVO childVo = transformToVo(child);
					childs.add(childVo);
				}
				
				menuVo.setMenus(childs);
			}
			
			menuVos.add(menuVo);
		}
		
		return menuVos;
	}
	
	/**
	 * 
	 * 方法概述：转换Menu实体
	 * 描述：转换Menu实体
	 * @param menu
	 * @return
	 * 返回类型：MenuVO
	 * 修改人：梁铭显 
	 * 修改时间：2013-9-27
	 */
	public MenuVO transformToVo(Menu menu){
		MenuVO menuVo = new MenuVO();
		
		menuVo.setId(menu.getId());
		menuVo.setLevel(menu.getLevel());
		menuVo.setLink(menu.getLink());
		menuVo.setMenuCode(menu.getMenuCode());
		menuVo.setMenuName(menu.getMenuName());
		
		return menuVo;
	}
}
